Type TScene Extends TEntity
	Global scenechilds:ISceneNode[]
	
Rem
bbdoc: L dt eine komplette Scene
about: Diese Funktion l dt eine komplette Scene im XML Format. 
Bitte beachte dass die vorherige Scene nicht gel scht wird! 
EndRem
	Function Load:TScene(scenefile:String)
		Local sc:TScene = Null

		Local cd:String = CurrentDir()
		Local dd:String = ExtractDir(scenefile)
		Local sf:String = StripDir(scenefile)
		If dd.Length Then ChangeDir(dd)
		
		If Self.irr_scene.loadScene(sf)
			sc = New TScene
			sc.getChilds()
		Else
			Print "Scene " + Chr(34) + sf + Chr(34) + " failed"
			DebugLog "Scene " + Chr(34) + sf + Chr(34) + " failed"
		End If
		
		If dd.Length Then ChangeDir(cd)
		
		Return sc
	End Function
	
	
	
	Method getChilds()
		Self.scenechilds = Self.irr_scene.getSceneNodesFromType(ESNT_ANY)
		
		For Local sn:IAnimatedMeshSceneNode = EachIn Self.scenechilds
			sn.setMaterialFlag(EMF_NORMALIZE_NORMALS, True)
			'sn.setMaterialFlag(EMF_LIGHTING, True)
			
			If Self.shadows Then sn.addShadowVolumeSceneNode(sn.getMesh())
		Next
	End Method
	
	
Rem
bbdoc: Sucht in der Szene nach einem Entity
about: FindByName() sucht in der Scene nach einem Entity (ISceneNode) das 
mit <i>nodename</i> benannt wurde. Konnte das Entity gefunden werden wird 
das Ergebnis als Objekt vom Typ ISceneNode zur ckgegeben, ansonsten NULL.
endrem
	Function FindByName:ISceneNode(nodename:String)
		Local result:ISceneNode = Null
		
		For Local c:ISceneNode = EachIn scenechilds
			If c.getName() = nodename
				result = c
				Exit
			End If
		Next
		
		Return result
	End Function
	
	
	Function FindEntityByName:TEntity(EntityName:String)
		Local resEntity:TEntity
		Local sn:ISceneNode = FindByName(EntityName)
		If sn <> Null
			Select sn.getType()										
				Case ESNT_ANIMATED_MESH
					resEntity = New TAnimMesh
					TAnimMesh(resEntity).msh = IAnimatedMeshSceneNode(sn).getMesh()
										
				Case ESNT_MESH
					resEntity = New TMesh
					TMesh(resEntity).msh = IMeshSceneNode(sn).getMesh()
					
				Case ESNT_CAMERA
					resEntity = New TCamera
				
				Case ESNT_CAMERA_FPS
					resEntity = TCamera.CreateFPS()
					resEntity.node	= sn
					resEntity.Pos	= sn.getPosition()
					resEntity.rot	= sn.GetRotation()
					resEntity.scl	= sn.GetScale()
					sn.drop()
					
				Case ESNT_LIGHT
					resEntity = New TLight
					
				Default
					resEntity = New TEntity
			End Select
			
			
			If sn.isValid()					
				resEntity.node	= sn
				resEntity.Pos	= sn.getPosition()
				resEntity.rot	= sn.GetRotation()
				resEntity.scl	= sn.GetScale()
			Else
				Print "scenenode is not valid"
				DebugLog "scenenode is not valid"
			EndIf
		EndIf
		
		Return resEntity
	End Function
	
	
	Method Delete()
		If Self.scenechilds <> Null
			For Local sc:ISceneNode = EachIn Self.scenechilds
				sc.drop()
				sc = Null
			Next
		End If
	End Method
End Type


Rem
bbdoc: L dt eine Scene
about: LoadIrrScene l dt eine Irrlicht-Scene.
endrem
Function LoadIrrScene:TScene(scenefile:String)
	Return TScene.Load(scenefile)
End Function


Rem
bbdoc: Sucht ein Entity mit dem Namen "entityname"
about: Nachdem eine Scene geladen ist kann man die einzelnen Objekte 
 ber ihren Namen ansprechen.
endrem
Function findEntity:TEntity(EntityName:String)
	Return TScene.FindEntityByName(EntityName)
End Function